#ifndef _JA_PROTOCOL__H
#define _JA_PROTOCOL__H
#include "stdint.h"
#define JA_Head 0xAA //JA 协议头

typedef enum
{
    JA_Decode_Proceed = 0x01U,
    JA_CRC_Fail = 0x02U,
    JA_Decode_OK = 0x03U
} JA_StatusTypeDef;

typedef struct
{
    uint8_t *bytes;
    uint16_t len;
} JA_BytesArray;
/**********************************
 * 协议数据
 * *******************************/
typedef struct
{
    uint16_t data_len;
    uint8_t *data;
    uint32_t Opcode;
} JA_Protocol_Data;
typedef struct
{
    uint8_t Address;      //协议地址
    uint8_t CS_Vsersion;  //协议版本
    uint8_t SN;           //序号
    uint16_t Payload_len; //协议数据长度
    JA_Protocol_Data data;
} JA_Protocol;
/*********************************
 * JA协议解析控制块
 * ******************************/
typedef struct
{
    uint16_t parse_pointer;                                    //协议解析指针
    uint8_t *command_buf;                                      //命令解析缓存
    uint16_t Buf_Size;                                         //缓存区大小
    uint16_t CRC_value;                                        //CRC校验值
    JA_Protocol protocol;                                      //命令数据
    JA_BytesArray (*Parse)(JA_Protocol, uint8_t *connand_buf); //解析函数
} JA_Protocol_TCB;

void JA_Create(JA_Protocol_TCB *tcb, JA_BytesArray (*Parse)(JA_Protocol, uint8_t *), uint8_t *buf, uint16_t size); //创建JA 协议解析
JA_StatusTypeDef JA_Decode(JA_Protocol_TCB *tcb, uint8_t data, JA_BytesArray *reply_buf);                          //解码数据,逐字节解码
JA_BytesArray JA_Decode_Array(JA_Protocol_TCB *tcb, uint8_t *data, uint16_t len);                                  //解码数据,逐条解码
uint16_t JA_Package(JA_Protocol protocol, uint8_t *bytes);
#endif
